]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
screencastService: Handle more gstreamer errors
authorJonas Dreßler <verdre@v0yd.nl>
Fri, 28 Jan 2022 23:40:24 +0000 (00:40 +0100)
committerJonas Dreßler <verdre@v0yd.nl>
Tue, 25 Apr 2023 16:57:47 +0000 (18:57 +0200)
Gstreamer can produce various errors, we shouldn't pretend those don't
exist and go on as usual when one happens. Instead, when an error
happens, tear down the pipeline, set our PipelineState to the new ERROR
state and bail out with a proper error message.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2197>

js/dbusServices/screencast/screencastService.js

index 7267673a592a693c276ec1dc9e9cdc1763152601..497b7d2063bcf07c1b17eb0faa67f9f2d22449cf 100644 (file)
@@ -231,12 +231,26 @@ var Recorder = class {
     _onBusMessage(bus, message, _) {
         switch (message.type) {
         case Gst.MessageType.EOS:
-            this._teardownPipeline();
-
             switch (this._pipelineState) {
+            case PipelineState.STOPPED:
+            case PipelineState.ERROR:
+                // In these cases there should be no pipeline, so should never happen
+                break;
+
+            case PipelineState.PLAYING:
+                this._addRecentItem();
+                this._handleFatalPipelineError('Unexpected EOS message');
+                break;
+
+            case PipelineState.INIT:
+                this._handleFatalPipelineError(
+                    'Unexpected EOS message while in state INIT');
+                break;
+
             case PipelineState.FLUSHING:
                 this._addRecentItem();
 
+                this._teardownPipeline();
                 this._unwatchSender();
                 this._stopSession();
 
@@ -248,6 +262,28 @@ var Recorder = class {
             }
 
             break;
+
+        case Gst.MessageType.ERROR:
+            switch (this._pipelineState) {
+            case PipelineState.STOPPED:
+            case PipelineState.ERROR:
+                // In these cases there should be no pipeline, so should never happen
+                break;
+
+            case PipelineState.INIT:
+            case PipelineState.PLAYING:
+            case PipelineState.FLUSHING:
+                // Everything else we can't handle, so error out
+                this._handleFatalPipelineError(
+                    `GStreamer error while in state ${this._pipelineState}: ${message.parse_error()[0].message}`);
+                break;
+
+            default:
+                break;
+            }
+
+            break;
+
         default:
             break;
         }